package com.topnav.mc.uitls;

import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Base64Utils {

	/**
	 * 文件复制
	 * @param fileName
	 * @param file
	 * @param toPath
	 * @throws IOException
	 */
	public static void copyFile(String fileName, File file, String toPath) throws IOException {
		InputStream inStream = null;
		FileOutputStream fs = null;
		try {
			// 字节总数
			int byteread = 0;
			inStream = new FileInputStream(file); // 读入原文件
			fs = new FileOutputStream(toPath + fileName);
			byte[] buffer = new byte[1024];
			while ((byteread = inStream.read(buffer)) != -1) {
				fs.write(buffer, 0, byteread);
			}
		} finally {
			fs.close();
			inStream.close();
		}
	}

	/**
	 * BASE64 TO Image
	 * @param base64
	 * @param filePath
	 * @return
	 */
	public static boolean decodeBase64ToImage(String base64, String filePath){

		BASE64Decoder decoder = new BASE64Decoder();
		FileOutputStream write = null;
		boolean bool = false;
        try {
        	write= new FileOutputStream(filePath);
            byte[] decoderBytes = decoder.decodeBuffer(base64);
            for (int i = 0; i < decoderBytes.length; ++i) {
                if (decoderBytes[i] < 0) {
                    // 调整异常数据
                	decoderBytes[i] += 256;
                }
            }
            write.write(decoderBytes);
            write.flush();
            bool = true;
        } catch (IOException e) {
        }finally {
			if( write != null){
				 try {
					write.close();
				} catch (IOException e) {
				}
			}
		}
		return bool;
	}

	public static void createFolder(String path) {
		File file = new File(path);
		if(!file.exists()){
			file.mkdirs();
		}
	}

	public static void deleteFile(String filePath){

		File files = new File(filePath);
		if(files.exists()){
			files.delete();
		}
	}


	public static boolean imgConvert(String oldImgPath,String newImgPath){
		boolean write = false;
		try {
			File fi = new File(oldImgPath); //大图文件
	        File fo = new File(newImgPath); //将要转换出的小图文件
	        if (!fo.exists()) {
	            fo.getParentFile().mkdirs();
	            //创建文件
	            fo.createNewFile();
	        }
	        int nw = 200;
				/*
				AffineTransform 类表示 2D 仿射变换，它执行从 2D 坐标到其他 2D
				坐标的线性映射，保留了线的“直线性”和“平行性”。可以使用一系
				列平移、缩放、翻转、旋转和剪切来构造仿射变换。
				*/
	        AffineTransform transform = new AffineTransform();
	        BufferedImage bis = ImageIO.read(fi); //读取图片
	        int w = bis.getWidth();
	        int h = bis.getHeight();
	        int nh = (nw*h)/w ;

	        double sx = (double)nw/w;
	        double sy = (double)nh/h;

	        transform.setToScale(sx,sy); //setToScale(double sx, double sy) 将此变换设置为缩放变换。
				/*
				 * AffineTransformOp类使用仿射转换来执行从源图像或 Raster 中 2D 坐标到目标图像或
				 *  Raster 中 2D 坐标的线性映射。所使用的插值类型由构造方法通过
				 *  一个 RenderingHints 对象或通过此类中定义的整数插值类型之一来指定。
				如果在构造方法中指定了 RenderingHints 对象，则使用插值提示和呈现
				的质量提示为此操作设置插值类型。要求进行颜色转换时，可以使用颜色
				呈现提示和抖动提示。 注意，务必要满足以下约束：源图像与目标图像
				必须不同。 对于 Raster 对象，源图像中的 band 数必须等于目标图像中
				的 band 数。
				*/
	        AffineTransformOp ato = new AffineTransformOp(transform,null);
	        BufferedImage bid = new BufferedImage(nw,nh,BufferedImage.TYPE_3BYTE_BGR);
	        /*
	         * TYPE_3BYTE_BGR 表示一个具有 8 位 RGB 颜色分量的图像，
	         * 对应于 Windows 风格的 BGR 颜色模型，具有用 3 字节存
	         * 储的 Blue、Green 和 Red 三种颜色。
	         */
	        ato.filter(bis,bid);
	        write = ImageIO.write(bid,"jpeg",fo);
	 	} catch(Exception e) {

	    }
	 		return write;

	}


	/**
	 * 本地图片转base64
	 */
	public static String imgFileToBase64(String imgFile) {
		BASE64Encoder encode = new BASE64Encoder();
		//将图片文件转化为字节数组字符串，并对其进行Base64编码处理
		byte[] buffer = null;
		//读取图片字节数组
		try(InputStream inputStream = new FileInputStream(imgFile);){
			int count = 0;
			while (count == 0) {
				count = inputStream.available();
			}
			buffer = new byte[count];
			inputStream.read(buffer);
		} catch (IOException e) {
			e.printStackTrace();
		}
		String ba64Str = encode.encodeBuffer(buffer);
		//System.out.println(ba64Str);
		return ba64Str;
		// 对字节数组Base64编码
/*		Encoder encode = Base64.getEncoder();
		return encode.encodeToString(buffer);*/
	}
}
